﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LiftEmulator.Model;
using LiftEmulator.View.Helpers;

namespace LiftEmulator.View
{

    /// <summary>
    /// Отображение текущей статистики перемещения лифта
    /// </summary>
    public class StatisticsView 
    {
        /// <summary>
        /// Строка с которой неоходимо выводить информацию 
        /// используется, для того, чтобы можно было отображать на экране сразу несколько
        /// разных представлений
        /// </summary>
        private int lineStart;

        /// <summary>
        /// Количество этажей, запоминаем для удобства вычисления строки
        /// </summary>
        private int numberOfFloor;


        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="lineStart">Строка с которой неоходимо выводить информацию</param>
        /// <param name="building">Модель здания, используется для получения нужной информации и подписки на необходимые события</param>
        public StatisticsView(int lineStart, Building building)
        {
            this.lineStart = lineStart;
            numberOfFloor = building.Floors.Length;

            // подписка на уведомление модели
            foreach (var floor in building.Floors) floor.FloorChange += (s, e) => DrawFloorPeople(((Floor)s).Number, e.NewQueue.Count());
            building.Lift.Boarding += (s, e) => DrawInnerLift(e.Inner.Count());
            building.Lift.ChangeFloor += (s, e) => DrawLiftFloor(e.CurrentFloor.Number);

            // отображение первоначальных значений
            foreach (var floor in building.Floors) DrawFloorPeople(floor.Number, floor.Count);             
            DrawInnerLift(building.Lift.Inner.Count());            
            DrawLiftFloor(building.Lift.CurrentFloor.Number);

        }


        /// <summary>
        /// Отображение количества человек в очереди на этаже
        /// </summary>
        /// <param name="number">номер этажа</param>
        /// <param name="count">количество людей в очереди</param>
        void DrawFloorPeople(int number, int count)
        {
            DrawHelper.Write(0, lineStart + (numberOfFloor - number), string.Format("{0} этаж: {1}", number, count));
        }


        /// <summary>
        /// Отображение количества человек в лифте
        /// </summary>
        /// <param name="count">количество человек</param>
        void DrawInnerLift(int count)
        {
            DrawHelper.Write(0, lineStart + numberOfFloor, string.Format("В лифте: {0}", count));            
        }


        /// <summary>
        /// Отображение этажа на котором находится лифт
        /// </summary>
        /// <param name="number"></param>
        void DrawLiftFloor(int number)
        {
            DrawHelper.Write(0, lineStart + numberOfFloor + 1, string.Format("Текущий этаж: {0}", number)); 
        }
    }
}
